package com.atguigu.shangrongbao.core.listener;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.atguigu.shangrongbao.core.mapper.DictMapper;
import com.atguigu.shangrongbao.core.pojo.dto.ExcelDictDto;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;

import java.util.ArrayList;
import java.util.List;


@NoArgsConstructor
@Slf4j
public class DictExeclDtoListener extends AnalysisEventListener<ExcelDictDto> {
    private DictMapper dictMapper;

    private static final Integer MaxBatchCount = 10;

    private List<ExcelDictDto> list = new ArrayList<>();
    public DictExeclDtoListener(DictMapper dictMapper) {
        this.dictMapper = dictMapper;
    }

    @Override
    public void invoke(ExcelDictDto excelDictDto, AnalysisContext analysisContext) {
        log.info("解析的数据：{}", excelDictDto);
        //存储数据
        list.add(excelDictDto);
        /**
         * 当达到10条插入数据库
         *  然后清空数组中数据
         */
        if(list.size() >= MaxBatchCount){
            dictMapper.batchInsert(list);
            list.clear();
        }

    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
         log.info("解析完成:{}", list);
         //如果解析完毕还有数据，把最后的一组数据插入数据库
         if(list.size() > 0){
             dictMapper.batchInsert(list);
         }
        /**
         * 一次性插入，但是如果数据过大就会有性能问题
         *   解决思路：
         *      1. 首先定义一个插入数据的最大常量
         *      2. 定义一个装数据的数组
         *      3. 规定数据在最大插入常量的数值时插入到数据库
         *      4. 每次插入后都重置一下存储数据的数组，从新放入
         */

        // dictMapper.batchInsert(list);
    }
}
